package com.errol.sync.sync;

import com.renjia.supervise.service.sync.pojo.EntityInfo;

import java.time.LocalDate;
import java.util.List;
import java.util.Map;

/**
 * @author zhang xiao bin
 * @version v1.0
 * @date 2021/07/05
 * @since v
 **/
public interface DatabaseSyncService {

    /**
     * 从众包数据库读取数据
     *
     * @param selectClause select 子句
     * @param whereClause  where 子句
     * @return 读取到的数据，map 的 key 为表字段名或属性名
     */
    List<Map<String, Object>> loadData(String selectClause, String whereClause);

    /**
     * 从众包数据库读取数据，并封装为 实体类对象
     *
     * @param entityInfo   实体类信息
     * @param selectClause select 子句
     * @param whereClause  where 子句
     * @param <E>          实体类型
     * @return 实体对象列表
     */
    <E> List<E> loadData(EntityInfo<E> entityInfo, String selectClause, String whereClause);

    /**
     * 全量同步，删除监管系统中数据，然后分批次批量写入
     *
     * @param entityInfo   实体类信息
     * @param data         数据
     * @param useFieldName true 表示 data 中使用表字段，false 表示 data 中使用类属性
     * @param <E>          实体类型
     */
    <E> void fullSync(EntityInfo<E> entityInfo, List<Map<String, Object>> data, boolean useFieldName);

    /**
     * 增量同步，分批次批量写入
     *
     * @param entityInfo   实体类信息
     * @param data         数据
     * @param useFieldName true 表示 data 中使用表字段，false 表示 data 中使用类属性
     * @param rangeLft     增量更新的日期左区间，包含
     * @param rangeRight   增加更新的日期右区间，包含
     * @param existIds     增量更新日期区间内更新过的数据的 id
     * @param <E>          实体类型
     */
    <E> void incrSync(EntityInfo<E> entityInfo, List<Map<String, Object>> data, boolean useFieldName, LocalDate rangeLft, LocalDate rangeRight, List<String> existIds);
}
